#pragma once

#include <gofcl_gpio_r.h>

// 每个引脚占1位的16位结构体
typedef struct {
	u8_s PIN0 : 1;
	u8_s PIN1 : 1;
	u8_s PIN2 : 1;
	u8_s PIN3 : 1;
	u8_s PIN4 : 1;
	u8_s PIN5 : 1;
	u8_s PIN6 : 1;
	u8_s PIN7 : 1;
	u8_s PIN8 : 1;
	u8_s PIN9 : 1;
	u8_s PIN10 : 1;
	u8_s PIN11 : 1;
	u8_s PIN12 : 1;
	u8_s PIN13 : 1;
	u8_s PIN14 : 1;
	u8_s PIN15 : 1;
} gpio_pins_s;

_Static_assert(sizeof(gpio_pins_s) == 2, "Struct gpio_pins_s defined error!");

static inline gpio_pins_s gpio_rreg_istat_s(gpio_qe gpio_q) {
	union {
		gpio_pins_s p;
		u32_s u;
	} pu = {
		.u = gpio_rreg(gpio_q, GPIO_ISTAT_R),
	};
	return pu.p;
}

static inline gpio_pins_s gpio_rreg_octl_s(gpio_qe gpio_q) {
	union {
		gpio_pins_s p;
		u32_s u;
	} pu = {
		.u = gpio_rreg(gpio_q, GPIO_OCTL_R),
	};
	return pu.p;
}

static inline void gpio_wreg_octl_s(gpio_qe gpio_q, gpio_pins_s pins) {
	union {
		gpio_pins_s p;
		u32_s u;
	} pu = {
		.p = pins,
	};
	gpio_wreg(gpio_q, GPIO_OCTL_R, pu.u);
}

static inline void gpio_wreg_bc_s(gpio_qe gpio_q, gpio_pins_s pins) {
	union {
		gpio_pins_s p;
		u32_s u;
	} pu = {
		.p = pins,
	};
	gpio_wreg(gpio_q, GPIO_BC_R, pu.u);
}
